import { toast } from "@/utils/tip";
export const toolbarConfig = {};

const maxImageFileSize = 1 * 1024 * 1024, // 1M
  maxVideoFileSize = 2 * 1024 * 1024 * 1024; // 2G;

export const editorConfig = {
  placeholder: "请输入内容...",
  MENU_CONF: {
    uploadImage: {
      /**
       * @description 自定义上传图片
       * @param {Object} file file 即选中的文件
       * @param {Function} insertFn 插入图片的方法 (url：图片地址 alt：未加载成功的默认 href：跳转的链接地址)
       * @returns
       */
      async customUpload(file, insertFn) {
        if (file.size > maxImageFileSize) {
          toast.fail("图片过大，请控制图片大小在1M以下");
          return false;
        }
        // 模拟接口返回
        setTimeout(() => {
          let url =
              "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg2.huashi6.com%2Fimages%2Fresource%2Fthumbnail%2F2022%2F03%2F28%2F151934_97403122471.jpg%3FimageMogr2%2Fquality%2F75%2Finterlace%2F1%2Fthumbnail%2F700x%2Fgravity%2FNorth%2Fcrop%2F700x1008%2Fformat%2Fjpeg&refer=http%3A%2F%2Fimg2.huashi6.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1673268419&t=c3f615c126e903da66341eeebec25e01",
            href = "https://ys.mihoyo.com/";
          insertFn(url, file.name, href);
        }, 300);
      },
    },
    uploadVideo: {
      /**
       * @description 自定义上传视频
       * @param {*} file file 即选中的文件
       * @param {*} insertFn  插入视频的方法 (url：视频地址 poster：作者名)
       */
      async customUpload(file, insertFn) {
        if (file.size > maxVideoFileSize) {
          toast.fail("视频过大，请控制视频大小在2G以下");
          return false;
        }
        // 模拟接口返回
        setTimeout(() => {
          let url = "http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4",
            poster = "未知";
          insertFn(url, poster);
        }, 300);
      },
    },
  },
};

export function customPaste(editor, event) {
  let html = event.clipboardData.getData("text/html"); // 获取粘贴的 html
  // let text = event.clipboardData.getData('text/plain') // 获取粘贴的纯文本
  let rtf = event.clipboardData.getData("text/rtf"); // 获取 rtf 数据（如从 word wsp 复制粘贴）
  if (html && rtf) {
    // 列表缩进会超出边框，直接过滤掉
    html = html.replace(/text\-indent:\-(.*?)pt/gi, "");

    // 从html内容中查找粘贴内容中是否有图片元素，并返回img标签的属性src值的集合
    const imgSrcs = findAllImgSrcsFromHtml(html);
    // 如果有
    if (imgSrcs && Array.isArray(imgSrcs) && imgSrcs.length) {
      //   // 从rtf内容中查找图片数据
      //   const rtfImageData = extractImageDataFromRtf(rtf);
      //   // 如果找到
      //   if (rtfImageData.length) {
      //     // TODO：此处可以将图片上传到自己的服务器上
      //     // 执行替换：将html内容中的img标签的src替换成ref中的图片数据，如果上面上传了则为图片路径
      //     html = replaceImagesFileSourceWithInlineRepresentation(
      //       html,
      //       imgSrcs,
      //       rtfImageData
      //     );
      //     editor.dangerouslyInsertHtml(html);
      //   }
    } else {
      editor.dangerouslyInsertHtml(html);
    }

    // 阻止默认的粘贴行为
    event.preventDefault();
    return false;
  } else {
    return true;
  }
}

/**
 * 从html代码中匹配返回图片标签img的属性src的值的集合
 * @param htmlData
 * @return Array
 */
function findAllImgSrcsFromHtml(htmlData) {
  let imgReg = /<img.*?(?:>|\/>)/gi; //匹配图片中的img标签
  let srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; // 匹配图片中的src

  let arr = htmlData.match(imgReg); //筛选出所有的img
  if (!arr || (Array.isArray(arr) && !arr.length)) {
    return false;
  }

  let srcArr = [];
  for (let i = 0; i < arr.length; i++) {
    let src = arr[i].match(srcReg);
    // 获取图片地址
    srcArr.push(src[1]);
  }

  return srcArr;
}
/**
 * 从rtf内容中匹配返回图片数据的集合
 * @param rtfData
 * @return Array
 */
function extractImageDataFromRtf(rtfData) {
  if (!rtfData) {
    return [];
  }

  const regexPictureHeader =
    /{\\pict[\s\S]+?({\\\*\\blipuid\s?[\da-fA-F]+)[\s}]*/;
  const regexPicture = new RegExp(
    "(?:(" + regexPictureHeader.source + "))([\\da-fA-F\\s]+)\\}",
    "g"
  );
  const images = rtfData.match(regexPicture);
  const result = [];

  if (images) {
    for (const image of images) {
      let imageType = false;

      if (image.includes("\\pngblip")) {
        imageType = "image/png";
      } else if (image.includes("\\jpegblip")) {
        imageType = "image/jpeg";
      }

      if (imageType) {
        result.push({
          hex: image
            .replace(regexPictureHeader, "")
            .replace(/[^\da-fA-F]/g, ""),
          type: imageType,
        });
      }
    }
  }

  return result;
}
/**
 * 将html内容中img标签的属性值替换
 * @param htmlData html内容
 * @param imageSrcs html中img的属性src的值的集合
 * @param imagesHexSources rtf中图片数据的集合，与html内容中的img标签对应
 * @param isBase64Data 是否是Base64的图片数据
 * @return String
 */
function replaceImagesFileSourceWithInlineRepresentation(
  htmlData,
  imageSrcs,
  imagesHexSources,
  isBase64Data = true
) {
  if (imageSrcs.length === imagesHexSources.length) {
    for (let i = 0; i < imageSrcs.length; i++) {
      const newSrc = isBase64Data
        ? `data:${imagesHexSources[i].type};base64,${_convertHexToBase64(
            imagesHexSources[i].hex
          )}`
        : imagesHexSources[i];

      htmlData = htmlData.replace(imageSrcs[i], newSrc);
    }
  }

  return htmlData;
}

/**
 * 十六进制转base64
 */
function _convertHexToBase64(hexString) {
  return btoa(
    hexString
      .match(/\w{2}/g)
      .map((char) => {
        return String.fromCharCode(parseInt(char, 16));
      })
      .join("")
  );
}
